iT邦幫忙

0

python 爬蟲自動更新header

  • 分享至 

  • xImage
  •  

在網路爬蟲中,自動更新 headers 是一種常用的技術,
用於模擬不同的用戶請求,以避免被目標網站屏蔽或識別為機器人。
Headers 是 HTTP 請求中的重要部分,
它包含了關於客戶端(如瀏覽器或爬蟲)的各種信息,
如用戶代理(User-Agent)、接受的內容類型(Accept)、語言(Accept-Language)等。

  1. Headers 的重要性
    目標網站可能根據請求的 headers 判斷:
  • 是否是正常的用戶(例如,來自瀏覽器)。
  • 是否存在違規行為(如過於頻繁的爬取)。
  • 針對特定用戶代理提供不同的內容。

例如,User-Agent 告訴伺服器請求是由哪種設備和瀏覽器發出的:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36

如果 User-Agent 固定不變,伺服器可能判斷這是機器人的行為。

要在 F12 開發者工具中找到 User-Agent,請按照以下步驟操作:

步驟 1:打開開發者工具
按 F12 鍵或右鍵點擊頁面,選擇 檢查(Inspect)來打開瀏覽器的開發者工具。
步驟 2:進入 Network 面板
在開發者工具中,切換到 Network 面板。這個面板顯示了所有網頁請求和回應的詳細資料。
步驟 3:查看網頁請求
確保你刷新了頁面(按 F5 或點擊刷新按鈕),以便捕獲所有請求。
步驟 4:選擇一個網頁請求
在 Network 面板中,你會看到很多請求項目。選擇一個請求(通常是網頁加載的第一個請求,或者是任何 API 請求)。
步驟 5:查看請求的 Headers
當選擇了一個請求後,會出現該請求的詳細信息。在右側的詳細信息窗格中,選擇 Headers 頁籤。
步驟 6:找到 User-Agent
在 Request Headers 部分,你會看到 User-Agent 標頭。這個標頭通常會顯示瀏覽器的詳細資訊,包含瀏覽器名稱、版本號、操作系統等等。

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
  1. 自動更新 Headers 的概念
    自動更新 headers 是指在爬取時,讓爬蟲的 HTTP 請求 headers 隨機化或動態變更。這通常涉及:
  • 隨機化 User-Agent: 模擬來自不同設備或瀏覽器的請求。
  • 定期更改 Referer 或 Accept-Language: 模擬不同語言用戶或點擊來源。
  • 使用 Header 池: 預先設置多組 headers,隨機選取。

1.使用命令行檢查(進階方式)

  • Google Chrome
    打開終端機(Terminal)輸入以下命令
    /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version
    你會看到類似以下輸出:
    Google Chrome 131.0.6778.109
  • Mozilla Firefox
    /Applications/Firefox.app/Contents/MacOS/firefox --version

在vscode內找到自己的Chrome版本並變成變數

import plistlib
import os

def get_chrome_version():
    # Chrome 安裝路徑
    chrome_info_plist = "/Applications/Google Chrome.app/Contents/Info.plist"

    # 確保文件存在
    if not os.path.exists(chrome_info_plist):
        return "Google Chrome is not installed in the default path."

    # 讀取 plist 文件
    with open(chrome_info_plist, 'rb') as plist_file:
        plist_data = plistlib.load(plist_file)
        # 獲取版本號
        version = plist_data.get('CFBundleShortVersionString', 'Unknown')
        return f"Google Chrome Version: {version}"

# 呼叫函數
print(get_chrome_version())

記得選擇要運行的虛擬環境 > 在terminal運行python 檔名webCrawler.py

2. 在vscode內找到自己的Mozilla Firefox版本

在某些版本的 Firefox 或某些安裝方式(例如從 Mac App Store 安裝的應用),application.ini 文件可能不再位於 /Applications/Firefox.app/Contents/MacOS 中。
解決方案

  • 在terminal使用 find 命令全局搜索:檢查 Contents/Resources 或其他子目錄中是否有 application.ini:
    find /Applications/Firefox.app -name "application.ini"
    會出現的位置
    /Applications/Firefox.app/Contents/Resources/application.ini
    返回vscode
firefox_info_plist = "/Applications/Firefox.app/Contents/Info.plist"

with open(firefox_info_plist, "rb") as plist_file:  
            plist_data = plistlib.load(plist_file)
            firefox_version = plist_data.get("CFBundleShortVersionString", "Unknown")
            print(f"Firefox version: {firefox_version}")

設置動態header

在 macOS 的 VS Code 中使用 Python 腳本找到 Chrome 的版本後,並將其動態設置為 HTTP 請求 Header 中的 User-Agent:

headers = {
           "User-Agent": user_agent}
          # 使用更新後的 User-Agent 進行請求
url ='https://www.ptt.cc/bbs/index.html'
response = requests.get(url, headers=headers)
print(f"Response Status Code: {response.status_code}")
print(len(response.text))

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言